package com.lang.exception;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 *
 */
public class ExceptionDemo {

    /**
     * 使用规范01 一般情况，不可以捕获异常然后不进行处理。参考java.lang.ClassLoader#loadClass(java.lang.String, boolean)中未处理异常
     */
    public void manual01(){
        try{

        }catch (Exception e){
        }
        return;
    }

    /**
     * 使用规范02 本方法中可以处理的异常由本方法自己处理，不能处理的异常交由调用者处理。一般情况不可以直接捕获Exception，因为这样调用者不知道具体异常是什么。
     */
    public void manual02() throws NumberFormatException,NullPointerException {
        try{
            File file = new File("afdasdfs");
            FileInputStream fileInputStream = new FileInputStream(file);
        }catch (FileNotFoundException e){
            //本方法默认处理该异常
        }
        return;
    }

    /**
     * 使用规范03 永远不要捕获Throwable类，因为Java中的Error也可以是Throwable的子类。但是Error是Java虚拟机本身无法控制的。Java虚拟机甚至可能不会在出现任何错误时请求用户的catch子句。
     */
    public void manual03() {
        try{
            File file = new File("afdasdfs");
            FileInputStream fileInputStream = new FileInputStream(file);
        }catch (Throwable e){
            //本方法默认处理该异常
        }
        return;
    }

    /**
     * 使用规范04 用户自定义的异常类封装原始的信息时为了不丢失堆栈请将捕获的异常放到封装的类中.
     */
    public void manual04() throws MyException {
        try{
            File file = new File("afdasdfs");
            FileInputStream fileInputStream = new FileInputStream(file);
        }catch (FileNotFoundException e){
            throw new MyException("没找到文件", e);
//            log.error("没找到文件",e);//抛出异常与打印堆栈二选一，否则会出现打印两个相同堆栈的
        }
        return;
    }


    /**
     * 查看Exception 中的getMessage信息
     * 这个信息很少
     */
    @Test
    public void test01() {
        try {
            Map map = new HashMap();
            map.put("a", "a");
            String s = (String) map.get("a");
            System.out.println(s);
            int i = Integer.parseInt(s);
            System.out.println(i);
        }catch (NumberFormatException e){
            String ee = e.getMessage();
            System.out.println(ee);
        }
        catch (Exception e){
            String ee = e.getMessage();
            System.out.println("T "+ee);
        }
    }

    /**
     * 堆栈信息
     */
    @Test
    public void test02() {
        try {
            int i = new Long(Long.MAX_VALUE).intValue();
            System.out.println(i);
            Map map = new HashMap();
            map.put("a", "a");
            String s = (String) map.get("a");
            System.out.println(s);
            i = Integer.parseInt(s);
            System.out.println(i);
        }catch (NumberFormatException e){
            e.printStackTrace();
        }
        catch (Throwable e){
            String ee = e.getMessage();
            System.out.println("T "+ee);
        }
    }
}

class MyException extends IOException {

    public MyException(String msg, Throwable e) {
        super(msg,e);
    }
}